home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / DOS.SWG / 0081_Wild cards.pas < prev    next >
Pascal/Delphi Source File  |  1995-03-03  |  3KB  |  160 lines

  1. {
  2.  JS> I'm looking for some sort of function to return that:
  3.  JS> SOMEFILE.TXT = SOM*.TX?
  4.  
  5. I've written that once. Sorry for the lack of comments.
  6.  
  7. --------------
  8. { Unit with universal wildcard search function, Arne de Bruijn, 1994, PD }
  9. unit find4dos;
  10.  
  11. interface
  12. function FindName(SearchStr,NameStr:string):boolean;
  13. implementation
  14. function FindName(SearchStr,NameStr:string):boolean; assembler;
  15. {
  16.  Compare SearchStr with NameStr, and allow wildcards in SearchStr.
  17.  The following wildcards are allowed:
  18.  *ABC*        matches everything which contains ABC
  19.  [A-C]*       matches everything that starts with either A,B or C
  20.  [ADEF-JW-Z]  matches A,D,E,F,G,H,I,J,W,V,X,Y or Z
  21.  ABC?         matches ABC, ABC1, ABC2, ABCA, ABCB etc.
  22.  ABC[?]       matches ABC1, ABC2, ABCA, ABCB etc. (but not ABC)
  23.  ABC*         matches everything starting with ABC
  24.  (for using with DOS filenames like DOS (and 4DOS), you must split the
  25.   filename in the extention and the filename, and compare them seperately)
  26. }
  27.  
  28. var
  29.  LastW:word;
  30. asm
  31.  cld
  32.  push ds
  33.  lds si,SearchStr
  34.  les di,NameStr
  35.  xor ah,ah
  36.  lodsb
  37.  mov cx,ax
  38.  mov al,es:[di]
  39.  inc di
  40.  mov bx,ax
  41.  or cx,cx
  42.  jnz @ChkChr
  43.  or bx,bx
  44.  jz @ChrAOk
  45.  jmp @ChrNOk
  46.  xor dh,dh
  47. @ChkChr:
  48.  lodsb
  49.  cmp al,'*'
  50.  jne @ChkQues
  51.  dec cx
  52.  jz @ChrAOk
  53.  mov dh,1
  54.  mov LastW,cx
  55.  jmp @ChkChr
  56. @ChkQues:
  57.  cmp al,'?'
  58.  jnz @NormChr
  59.  inc di
  60.  or bx,bx
  61.  je @ChrOk
  62.  dec bx
  63.  jmp @ChrOk
  64. @NormChr:
  65.  or bx,bx
  66.  je @ChrNOk
  67. {From here to @No4DosChr is used for [0-9]/[?]/[!0-9] 4DOS wildcards...}
  68.  cmp al,'['
  69.  jne @No4DosChr
  70.  cmp word ptr [si],']?'
  71.  je @SkipRange
  72.  mov ah,byte ptr es:[di]
  73.  xor dl,dl
  74.  cmp byte ptr [si],'!'
  75.  jnz @ChkRange
  76.  inc si
  77.  dec cx
  78.  jz @ChrNOk
  79.  inc dx
  80. @ChkRange:
  81.  lodsb
  82.  dec cx
  83.  jz @ChrNOk
  84.  cmp al,']'
  85.  je @NChrNOk
  86.  cmp ah,al
  87.  je @NChrOk
  88.  cmp byte ptr [si],'-'
  89.  jne @ChkRange
  90.  inc si
  91.  dec cx
  92.  jz @ChrNOk
  93.  cmp ah,al
  94.  jae @ChkR2
  95.  inc si              {Throw a-Z < away}
  96.  dec cx
  97.  jz @ChrNOk
  98.  jmp @ChkRange
  99. @ChkR2:
  100.  lodsb
  101.  dec cx
  102.  jz @ChrNOk
  103.  cmp ah,al
  104.  ja @ChkRange        {= jbe @NChrOk; jmp @ChkRange}
  105. @NChrOk:
  106.  or dl,dl
  107.  jnz @ChrNOk
  108.  inc dx
  109. @NChrNOk:
  110.  or dl,dl
  111.  jz @ChrNOk
  112. @NNChrOk:
  113.  cmp al,']'
  114.  je @NNNChrOk
  115. @SkipRange:
  116.  lodsb
  117.  cmp al,']'
  118.  loopne @SkipRange
  119.  jne @ChrNOk
  120. @NNNChrOk:
  121.  dec bx
  122.  inc di
  123.  jmp @ChrOk
  124. @No4DosChr:
  125.  cmp es:[di],al
  126.  jne @ChrNOk
  127.  inc di
  128.  dec bx
  129. @ChrOk:
  130.  xor dh,dh
  131.  dec cx
  132.  jnz @ChkChr        { Can't use loop, distance >128 bytes }
  133.  or bx,bx
  134.  jnz @ChrNOk
  135. @ChrAOk:
  136.  mov al,1
  137.  jmp @EndR
  138. @ChrNOk:
  139.  or dh,dh
  140.  jz @IChrNOk
  141.  jcxz @IChrNOk
  142.  or bx,bx
  143.  jz @IChrNOk
  144.  inc di
  145.  dec bx
  146.  jz @IChrNOk
  147.  mov ax,[LastW]
  148.  sub ax,cx
  149.  add cx,ax
  150.  sub si,ax
  151.  dec si
  152.  jmp @ChkChr
  153. @IChrNOk:
  154.  mov al,0
  155. @EndR:
  156.  pop ds
  157. end;
  158.  
  159. end.
  160.